package jmine.tec.subscription.impl;

import jmine.tec.subscription.Publication;
import jmine.tec.subscription.Publisher;
import jmine.tec.subscription.SubscriptionManager;
import jmine.tec.subscription.SubscriptionSettings;

/**
 * Interface exposta às demais classes deste pacote. Implementacoes desta classe deveriam ser thread-safe
 * 
 * @author takeshi
 */
public interface SubscriptionManagerImplementor extends SubscriptionManager {

    /**
     * Sinaliza este {@link SubscriptionManagerImplementor} que uma nova publicacao esta disponivel, mas envia apenas uma
     * {@link PartialPublication}. Esta partial publication deve ser fundida com a publicacao anterior antes de ser disponibilizada para os
     * callbacks, mas soh precisa faze-lo se houver algum Subscriber interessado
     * 
     * @param <P> o tipo da {@link Publication}
     * @param source {@link Publisher} que originou a {@link Publication}
     * @param settings os {@link SubscriptionSettings}
     * @param published a publication
     */
    <P extends Publication> void broadcastPartialPublication(Publisher<P> source, SubscriptionSettings settings,
            PartialPublication<P> published);

    /**
     * Sinaliza este {@link SubscriptionManagerImplementor} que uma nova publicacao esta disponivel, sem que a publicacao seja
     * replicada.Este metodo soh deve ser chamado por Replicadores
     * 
     * @param <P> o tipo da {@link Publication}
     * @param source {@link Publisher} que originou a {@link Publication}
     * @param settings os {@link SubscriptionSettings}
     * @param published a publication
     */
    <P extends Publication> void localPublish(Publisher<P> source, SubscriptionSettings settings, P published);

    /**
     * Sinaliza este {@link SubscriptionManagerImplementor} que uma nova publicacao esta disponivel, mas envia apenas uma
     * {@link PartialPublication}. Esta partial publication deve ser fundida com a publicacao anterior antes de ser disponibilizada para os
     * callbacks, mas soh precisa faze-lo se houver algum Subscriber interessado.
     * <p>
     * Alem disso, a publicacao daki nao eh replicada.
     * <p>
     * Este metodo soh deve ser chamado por Replicadores
     * 
     * @param <P> o tipo da {@link Publication}
     * @param source {@link Publisher} que originou a {@link Publication}
     * @param settings os {@link SubscriptionSettings}
     * @param published a publication
     */
    <P extends Publication> void localPublishPartialPublication(Publisher<P> source, SubscriptionSettings settings,
            PartialPublication<P> published);

    /**
     * Devolve uma {@link Publication} para o {@link Publisher} e {@link SubscriptionSettings} passado. Este metodo pode ou nao querer uma
     * visita ao banco de dados.
     * 
     * @param <P> o tipo da {@link Publication}
     * @param source {@link Publisher}
     * @param settings {@link SubscriptionSettings}
     * @return {@link Publication}
     */
    <P extends Publication> P getPublication(Publisher<P> source, SubscriptionSettings settings);

}
